﻿using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using System.Text;

namespace EveMarketsDAO
{
	public partial class ContexteDAO
	{
		/// <summary>
		/// Retourne la date de la dernière mise à jour.
		/// </summary>
		/// <returns></returns>
		public static DateTime DerniereDateUpdate()
		{
			return (from dd in ContexteDAO.ContexteDonnees.UpdateBase
			        select dd.LastUpdate).First();
		}

		/// <summary>
		/// Permet d'avoir la liste des stations en fonction du nom du Système.
		/// </summary>
		/// <param name="nomSysteme"></param>
		/// <returns></returns>
		public static IQueryable<string> ChoixStationParRapportAuSysteme(string nomSysteme)
		{
			return (from dd in ContexteDAO.ContexteDonnees.staStations
					where String.Equals(dd.mapSolarSystems.solarSystemName, nomSysteme)
					orderby dd.stationName
					select dd.stationName);
		}

		/// <summary>
		/// Permet d'avoir la liste des systèmes en fonction du nom de la région.
		/// </summary>
		/// <param name="nomRegion"></param>
		/// <returns></returns>
		public static IQueryable<string> ChoixSystemeParRapportRegion(string nomRegion)
		{
			return (from dd in ContexteDAO.ContexteDonnees.mapSolarSystems
					where String.Equals(dd.mapRegions.regionName, nomRegion)
					orderby dd.solarSystemName
					select dd.solarSystemName);
		}

		/// <summary>
		/// Permet d'avoir la liste des systèmes en fonction du nom de la région.
		/// </summary>
		/// <returns></returns>
		public static IQueryable<string> ChargeListeDesRegions()
		{
			return (from dd in ContexteDAO.ContexteDonnees.mapRegions
					where dd.regionName != "Unknown"
					orderby dd.regionName ascending
					select dd.regionName);
		}

		/// <summary>
		/// Vérifie la présence de l'item dans la table des Items
		/// </summary>
		/// <param name="nomItem">Nom de l'item à tester</param>
		/// <returns>TRUE existe dans la table</returns>
		public static bool VerifiePresenceDeLitem(string nomItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.invItemsTypes
					where dd.published == true
					select dd.typeName).Contains(nomItem);
		}

		/// <summary>
		/// Ramène l'ID de l'item, par rapport à son nom
		/// </summary>
		/// <param name="nomItem"></param>
		/// <returns></returns>
		public static int NumeroIdItem(string nomItem)
		{
			return (from dd in ContexteDAO.ContexteDonnees.invItemsTypes
			        where dd.typeName == nomItem
			        select dd.typeID).First();
		}

		#region Recherche ID REgion ou station ou systeme
		/// <summary>
		/// Retourne l'ID région, système et station en fonction du nom de la station
		/// </summary>
		/// <param name="nomStation"></param>
		/// <returns></returns>
		public static Tuple<int, int, int> DonneIdStationSystemRegion(string nomStation)
		{
			var infoGeo = (from dd in ContexteDAO.ContexteDonnees.staStations
						   where dd.stationName == nomStation
						   select new
									{
										idReg = dd.regionID,
										idSyst = dd.solarSystemID,
										idStat = dd.stationID
									}).First();

			return new Tuple<int, int, int>((int)infoGeo.idReg, (int)infoGeo.idSyst, infoGeo.idStat);
		}

		/// <summary>
		/// Retourne l'ID région et du système en fonction du nom du système
		/// </summary>
		/// <param name="nomSysteme"></param>
		/// <returns></returns>
		public static Tuple<int, int> DonneIdSystemRegion(string nomSysteme)
		{
			var infoGeo = (from dd in ContexteDAO.ContexteDonnees.mapSolarSystems
						   where dd.solarSystemName == nomSysteme
						   select new
						   {
							   idReg = dd.regionID,
							   idSyst = dd.solarSystemID,
						   }).First();

			return new Tuple<int, int>((int)infoGeo.idReg, infoGeo.idSyst);
		}

		/// <summary>
		/// Retourne l'ID région en fonction du nom de la région
		/// </summary>
		/// <param name="nomRegion"></param>
		/// <returns></returns>
		public static int DonneIdRegion(string nomRegion)
		{
			return (from dd in ContexteDAO.ContexteDonnees.mapRegions
					where dd.regionName == nomRegion
					select dd.regionID).First();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="nomProfil"></param>
		/// <param name="skillIndustry"></param>
		/// <param name="skillProd"></param>
		/// <param name="staAchat"></param>
		/// <param name="staVente"></param>
		/// <returns></returns>
		public static bool SaveProfil(string nomProfil, short skillIndustry, short skillProd, string staAchat, string staVente)
		{
			// Si le profil n'existe pas (ayant le même nom)
			if(!Contexte.Profils.Any(x => x.NomProfil.Equals(nomProfil)))
			{
				var profil = Contexte.Profils.CreateObject();
				profil.NomProfil = nomProfil;
				profil.SkillIndustry = skillIndustry;
				profil.SkillProdEff = skillProd;
				profil.stationAchat =
					ContexteDonnees.staStations.Where(x => x.stationName.Equals(staAchat)).Select(x => x.stationID).First();
				profil.stationVente =
					ContexteDonnees.staStations.Where(x => x.stationName.Equals(staVente)).Select(x => x.stationID).First();

				ContexteDonnees.Profils.AddObject(profil);
				ContexteDonnees.SaveChanges();
			}
			else
			{
				Contexte.ExecuteStoreCommand(@"DELETE FROM Profils WHERE NomProfil = '" + nomProfil + "';");

				int achat = ContexteDonnees.staStations.Where(x => x.stationName.Equals(staAchat)).Select(x => x.stationID).First();
				int vente = ContexteDonnees.staStations.Where(x => x.stationName.Equals(staVente)).Select(x => x.stationID).First();
				
				Contexte.ExecuteStoreCommand(
					@"INSERT INTO Profils (NomProfil, SkillIndustry, SkillProdEff, stationAchat, stationVente)
												VALUES ('" +
						nomProfil + "'," + skillIndustry + "," + skillProd + "," + achat + "," + vente + ");");

				Contexte.Refresh(RefreshMode.StoreWins, Contexte.Profils);
			}

			return true;
		}


		#endregion

	}
}
